(function(window) {
	// clientInfo 设备的信息，通过plus.push获取，用来认证
	var socket, clientInfo, vm;
	// 设置最后同步时间和详消息个数，在plusReady之后执行
	var setSyncTime, getSyncTime, setMsgCount, getMsgCount;
	// 只显示系统通知,系统的id写死
	//	var systemUid = 'uid-57346b5280f9a4e4447475bd';
	var systemUname = '系统';
	// 初始化数据库查询model，DbModel是db.js中的类
	var msgModel = new DbModel('dialogue', ['_id', 'mid', 'uid', 'name', 'type', 'msg', 'time', 'reciever']);
	var friendModel = new DbModel('friend', ['uid', 'fid', 'state', 'sid', 'name', 'photoid', 'photo', 'kefu']);

	/**
	 * 连接
	 */
	function connect(userName) {
		// 设置最后请求时间和消息个数，用用户名区分，防止取到其他用户的信息
		setSyncTime = dataManager.set(userName + 'lastSync');
		getSyncTime = dataManager.get(userName + 'lastSync');
		setMsgCount = dataManager.set(userName + 'msgCount');
		getMsgCount = dataManager.get(userName + 'msgCount');
		//  同步消息个数
		vm.msg.count = getMsgCount();
		if(socket === undefined) {
			socket = io('https://lvzhouchat.h3c.com', {
				secure: true,
				reconnect: true,
				reconnectionAttempts: 5,
				reconnectionDelay: 1000,
				autoConnect: true
			});
		}

		clientInfo = plus.push.getClientInfo();

		socket.on('connecting', function() {
			vm.loadingText = vm.$t('connecting');
			console.log('正在链接服务器');
		});

		socket.on('connect_error', function() {
			vm.loadingText = vm.$t('connectErr');
			vm.authenticated = false;
			console.log('链接服务器失败');
		});

		socket.on('connect_timeout', function() {
			vm.loadingText = vm.$t('connectTimeout');
			vm.authenticated = false;
			console.log('链接服务器超时');
		});

		socket.on('connect', function() {
			vm.connect = true;
			console.log('socket已经建立了' + socket.id);
		});

		socket.on('disconnect', function() {
			vm.connect = false;
			vm.authenticated = false;
			console.log(socket.id);
			console.log("已经失去链接");
		});

		socket.on('reconnecting', function() {
			vm.loadingText = vm.$t('reconnect');
			console.log("正在重新连接服务器");
		});

		socket.on('reconnect', function() {
			console.log("重新连接到服务器");
			vm.connect = true;
			//			    console.log("reconnect");  
			//              global.reconnectFailCount--;  
		});

		socket.on('authenticated', function(result) {
			console.log('认证结果：' + result);
			if(!result) {
				vm.loadingText = vm.$t('authErr');
				$.confirm(vm.$t('authErrConfirm'), '', [vm.$t('base.no'), vm.$t('base.yes')], function(ok) {
					if(ok.index === 1) { // 是
						authentication();
					}
				});
			}
			// 认证结果变化了会加载一些数据,请看vue的watch
			vm.authenticated = result;
		});

		socket.on('message', function(ms) {
			//			console.log('收到新消息：' + JSON.stringify(ms));
			//  设置同步时间
			setSyncTime($.util.formatDate(new Date(), 'y-M-d H:m:s'));
			//  获取消息
			if(ms.body && ms.body.length && ms.body[0].msgs && ms.body[0].msgs.length) {
				var msgInfo = ms.body[0];
				var msg = msgInfo.msgs[0];
				// 插入到数据库
				msgModel.insert([null, msg.mid, msg.uid, msg.name, msg.type, unescape(msg.msg), msg.time, vm.userInfo.uid]);
				vm.messages.push({
					_id: +new Date(),
					mid: msg.mid,
					uid: msg.uid,
					name: msg.name,
					type: msg.type,
					msg: unescape(msg.msg),
					time: msg.time,
					reciever: vm.userInfo.uid
				});
				// TODO 只统计系统消息
				if(unescape(msg.name) === systemUname) {
					vm.msg.count++;
					console.log("msg.count:" + vm.msg.count);
					//  设置会话列表
					setSessionList(msg);
					$.plusReady(function() {
						$.fire(plus.webview.getWebviewById('im.html'), 'recieve', {
							msg: msg
						});
						plus.push.createMessage(unescape(msg.msg).replace(/\<\/br\>/g, '\r\n'), null, {
							title: unescape(msg.name)
						});
					});
				}
			}
		});
	}

	/**
	 * 认证
	 */
	function authentication() {
		console.log('正在认证...');
		console.log(dataManager.getSession());
		vm.loadingText = vm.$t('authing');
		socket.emit('authentication', {
			// 使用sessionId认证，登录已存储
			chatid: dataManager.getSession(),
			query: false,
			devtype: plus.os.name,
			clientid: clientInfo.clientid,
			token: clientInfo.token,
			quiet: {}
		});
	}

	/**
	 * 设置会话列表
	 * @param {Object} msg 最后一条消息
	 */
	function setSessionList(msg) {
//		console.log(JSON.stringify(msg));
		vm.$set(vm.sessionList, msg.uid, {
			name: unescape(msg.name),
			photo: 'images/logo.png',
			lastMsg: unescape(msg.msg).replace(/\s+|\\n|\\r|\\r\\n|(<\/?br\/?>)/,' ')
		});
	}

	/**
	 * 获取当前的用户信息
	 */
	function getUserInfo() {
		socket.emit('getselfinfo', {}, function(data) {
			vm.userInfo = data;
			// 获取自己的头像
			getUserImg(data.uid, function(img) {
				vm.$set(vm.userInfo, 'headImg', img);
				//  通知“我的”页面修改头像
				convertImg(img, function(image) {
					vm.headImg = image; //  headImg属性是profile的js上面
				});
			});
		});
	}

	/**
	 * 获取消息列表
	 */
	function getMessages() {
		console.log(getSyncTime());
		// 获取最近的消息
		socket.emit('msgSync', {
			//  最后同步时间
			//			lastTime: getSyncTime() || '2000-01-01 00:00'
		}, function(data) {
			var msgList = [];
			console.log(JSON.stringify(data));
			//  查询数据库存储的,收件人是自己的
			msgModel.query({
				reciever: vm.userInfo.uid
			}, function(code, res) {
				if(code === 0) {
					msgList = msgList.concat(res);
					//  在拼接现在获取到的消息
					if(data.result === 'success' && data.body.length) {
						msgList = msgList.concat(data.body[0].msgs);
						// 将获取到的数据插入到数据库中
						data.body[0].msgs.forEach(function(msg) {
							msgModel.insert([msg._id, msg.mid, msg.uid, unescape(msg.name), msg.type, unescape(msg.msg), msg.time, vm.userInfo.uid]);
							// TODO 只统计系统消息
							if(unescape(msg.name) === systemUname) {
								vm.msg.count = data.body[0].msgs.length;
							}
						});

					}
					vm.messages = msgList;
					/**
					 * 所有的消息
					 */
					msgList.forEach(function(msg) {
						// 设置会话，只设置系统的
						if(unescape(msg.name) === systemUname) {
							setSessionList(msg);
						}
					});
				}
			});
		});
	}

	/**
	 * 获取用户头像
	 * @param {Object} uid
	 * @param {Object} callback
	 */
	function getUserImg(uid, callback) {
		socket.emit("userPhotoGet", {
			uid: uid
		}, function(data) {
			if(data.result === 'success' && data.body && data.body.image) {
				callback(data.body.image);
			} else {
				callback(null);
			}
		})
	}

	/**
	 * 获取好友列表
	 */
	function getFriendList(callback) {
		vm.loadingText = vm.$t('loadingFriends');
		socket.emit('friendsync', {
			addkefu: true
		}, function(data) {
			if(data.result === 'success') {
				vm.loadingText = '';
				vm.friendList = data.body;
				callback();
			} else {
				vm.loadingText = vm.$t('loadFriendFail');
				vm.friendList = [];
				$.confirm(me.$t('frieldLoadErr'), '', [vm.$t('base.no'), vm.$t('base.yes')], function(ok) {
					if(ok.index === 1) { // 是
						getFriendList(getMessages);
					}
				});
			}
			// 先清空好友列表,然后重新插入数据
			friendModel.clear();

			vm.friendList.forEach(function(f) {
				if(unescape(f.name) === systemUname) {
					// 初始化sessionList
					setSessionList({
						uid: f.uid,
						name: unescape(f.name),
						msg: vm.$t('noMsg')
					});
				}
				f.name = unescape(f.name);
				getUserImg(f.uid, function(img) {
					friendModel.insert([vm.userInfo.uid, f.uid, f.state, f.sid, f.name, f.photoid, img, f.kefu]);
				});
			});
			/**
			 * 查看新的好友的个数
			 */
			vm.newFriendNum = vm.friendList.filter(function(f) {
				return f.state === 'wait_me';
			}).length;
		});
	}
	/**
	 * 同意好友的请求
	 * @param {*} name
	 * @param {*} uid
	 */
	function acceptFriend(name, uid) {
		console.log('处理好友请求.');
		socket.emit("friendAccept", {
			fname: escape(name),
			uid: escape(uid)
		}, function(data) {
			if(data.result === 'success') {
				console.log('通过了好友的验证。');
				getFriendList();
			} else {
				$.plusReady(function() {
					$.fire(plus.webview.getWebviewById('newfriends.html'), 'accepted', {
						isOk: data.result === 'success'
					});
				});
			}
		});
	}

	/**
	 * 链接服务器，防止多次重连和触发事件
	 * @param {Object} userName
	 */
	function connectServer(userName) {
		if(!socket) {
			connect(userName);
		} else if(!socket.id) {
			socket.open();
		}
	}

	function mounted() {
		var me = vm = this;
		//	初始化回话列表
		$.plusReady(function() {
			var userName = dataManager.getUserName();

			document.addEventListener("resume", function() {
				console.log("app resume socket.id=" + socket.id);
				connectServer(userName);
			}, false);

			connectServer(userName);
		});
	}

	window.addEventListener('friendAccept', function(e) {
		var data = e.detail;
		acceptFriend(data.name, data.uid);
	});

	window.addEventListener('clearMsg', function(e) {
		vm.msg.count = 0;
		console.log('clear all msg....');
		// 要清理消息，否则角标会一直累计
		plus.push.clear();
		// 清理所有的消息，并且将最后接受时间修改为现在
		setSyncTime($.util.formatDate(new Date(), 'y-M-d H:m:s'));
	});

	window.chat = {
		mounted: mounted,
		data: {
			connect: false,
			userInfo: {}, //  我的信息
			authenticated: false, //  是否认证了
			friendList: [], //  好友列表
			messages: [], // 消息列表
			sessionList: {}, //  会话列表
			newFriendNum: 0, // 新朋友个数
			msg: {
				count: 0 //  消息统计，存储为对象是防止v-for创建的独立的作用域导致双向绑定失败
			},
			loadingText: ''
		},
		watch: {
			//  用户信息变化立刻存储到dataManager
			userInfo: function(info) {
				if(info) {
					dataManager.set('chatUserInfo', info);
				} else {
					dataManager.set('chatUserInfo', null);
				}
			},
			// 连接后去认证
			connect: function(res) {
				if(res) {
					authentication();
				}
			},
			// 认证了就去获取相关的信息
			authenticated: function(res) {
				console.log(res);
				if(res) {
					//  获取自己的个人信息
					getUserInfo();
					//  消息依赖于好友列表
					getFriendList(getMessages);
				}
			},
			'msg.count': function(count) {
				//  自动将msgCount存储到localStorage
				setMsgCount(isNaN(Number(count)) ? 0 : Number(count));
				//	通知首页去展示消息
				$.plusReady(function() {
					$.fire(plus.webview.getLaunchWebview(), 'msgCountChange', {
						count: count
					});
					//  设置app的角标
					plus.runtime.setBadgeNumber('' + count);
					console.log("badge num:" + count);
				});
			}
		}
	};
})(window);